//编码顶层
module code_top(
//时钟复位
i_clk,
i_rst_n,
//编码使能
i_code_en,
//输入数据
i_code_data,
//编码完成，输出地址数据
o_code_finish,
o_code_addr,
o_code_final_data
);

//时钟复位
input          i_clk;
input          i_rst_n;
//编码使能
input          i_code_en;
//输入数据
input  [31:0]  i_code_data;
//编码完成，输出地址数据
output         o_code_finish;
output [8:0]   o_code_addr;
output [31:0]  o_code_final_data;
//编码控制计数器
wire   [8:0]   code_cnt;
//编码数据
wire   [31:0]  code_p1;
wire   [31:0]  code_p2;

wire   [767:0] x_0;
wire   [767:0] x_1;
wire   [767:0] x_2;
wire   [767:0] x_3;
wire   [767:0] x_4;
wire   [767:0] x_5;
wire   [767:0] x_6;
wire   [767:0] x_7;

wire   [255:0] l_0;
wire   [255:0] l_1;
wire   [255:0] l_2;
wire   [255:0] l_3;
wire   [255:0] l_4;
wire   [255:0] l_5;
wire   [255:0] l_6;
wire   [255:0] l_7;

wire   [255:0] m_0;
wire   [255:0] m_1;
wire   [255:0] m_2;
wire   [255:0] m_3;
wire   [255:0] m_4;
wire   [255:0] m_5;
wire   [255:0] m_6;
wire   [255:0] m_7;

wire   [767:0] xs_0;
wire   [767:0] xs_1;
wire   [767:0] xs_2;
wire   [767:0] xs_3;
wire   [767:0] xs_4;
wire   [767:0] xs_5;
wire   [767:0] xs_6;
wire   [767:0] xs_7;

wire   [255:0] ls_0;
wire   [255:0] ls_1;
wire   [255:0] ls_2;
wire   [255:0] ls_3;
wire   [255:0] ls_4;
wire   [255:0] ls_5;
wire   [255:0] ls_6;
wire   [255:0] ls_7;

wire   [255:0] mp1_0;
wire   [255:0] mp1_1;
wire   [255:0] mp1_2;
wire   [255:0] mp1_3;
wire   [255:0] mp1_4;
wire   [255:0] mp1_5;
wire   [255:0] mp1_6;
wire   [255:0] mp1_7;

//编码控制器
code_cntrl u_code_cntrl(
    //时钟复位
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    //编码使能
    .i_code_en(i_code_en),
    //编码数据
    .i_code_p1(code_p1),
    .i_code_p2(code_p2),
    //编码完成
    .o_code_finish(o_code_finish),
    //编码控制计数器
    .o_code_cnt(code_cnt),
    //输出地址数据
    .o_code_addr(o_code_addr),
    .o_code_final_data(o_code_final_data)
);

code_p1 u_code_p1(
    //时钟复位
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    //编码使能
    .i_code_en(i_code_en),
    //编码控制计数器
    .i_code_cnt(code_cnt),
    //输入数据
    .i_xs_0(xs_0),
    .i_xs_1(xs_1),
    .i_xs_2(xs_2),
    .i_xs_3(xs_3),
    .i_xs_4(xs_4),
    .i_xs_5(xs_5),
    .i_xs_6(xs_6),
    .i_xs_7(xs_7),
    //输出数据
    .o_code_p1(code_p1)
);

code_p2 u_code_p2(
    //时钟复位
    .i_clk(i_clk),
    .i_rst_n(i_rst_n),
    //编码使能
    .i_code_en(i_code_en),
    //编码控制计数器
    .i_code_cnt(code_cnt),
    //输入数据
    .i_ls_0(ls_0),
    .i_ls_1(ls_1),
    .i_ls_2(ls_2),
    .i_ls_3(ls_3),
    .i_ls_4(ls_4),
    .i_ls_5(ls_5),
    .i_ls_6(ls_6),
    .i_ls_7(ls_7),
    .i_mp1_0(mp1_0),
    .i_mp1_1(mp1_1),
    .i_mp1_2(mp1_2),
    .i_mp1_3(mp1_3),
    .i_mp1_4(mp1_4),
    .i_mp1_5(mp1_5),
    .i_mp1_6(mp1_6),
    .i_mp1_7(mp1_7),
    //输出数据
    .o_code_p2(code_p2)
);

//乘法表
code_multi u_code_multi(
    //信息位和p1一次8个，xlm阵一次8列
    .i_di(i_code_data),
    .i_p1(code_p1),
    //192*4
    .i_x_0(x_0),
    .i_x_1(x_1),
    .i_x_2(x_2),
    .i_x_3(x_3),
    .i_x_4(x_4),
    .i_x_5(x_5),
    .i_x_6(x_6),
    .i_x_7(x_7),
    //64*4
    .i_l_0(l_0),
    .i_l_1(l_1),
    .i_l_2(l_2),
    .i_l_3(l_3),
    .i_l_4(l_4),
    .i_l_5(l_5),
    .i_l_6(l_6),
    .i_l_7(l_7),
    //64*4
    .i_m_0(m_0),
    .i_m_1(m_1),
    .i_m_2(m_2),
    .i_m_3(m_3),
    .i_m_4(m_4),
    .i_m_5(m_5),
    .i_m_6(m_6),
    .i_m_7(m_7),

    //输出八列
    //192*4
    .o_xs_0(xs_0),
    .o_xs_1(xs_1),
    .o_xs_2(xs_2),
    .o_xs_3(xs_3),
    .o_xs_4(xs_4),
    .o_xs_5(xs_5),
    .o_xs_6(xs_6),
    .o_xs_7(xs_7),
    //64*4
    .o_ls_0(ls_0),
    .o_ls_1(ls_1),
    .o_ls_2(ls_2),
    .o_ls_3(ls_3),
    .o_ls_4(ls_4),
    .o_ls_5(ls_5),
    .o_ls_6(ls_6),
    .o_ls_7(ls_7),
    //64*4
    .o_mp1_0(mp1_0),
    .o_mp1_1(mp1_1),
    .o_mp1_2(mp1_2),
    .o_mp1_3(mp1_3),
    .o_mp1_4(mp1_4),
    .o_mp1_5(mp1_5),
    .o_mp1_6(mp1_6),
    .o_mp1_7(mp1_7)
);

// rom_x u_rom_x(
//     .i_code_cnt(code_cnt),
//     .o_x_0(x_0),
//     .o_x_1(x_1),
//     .o_x_2(x_2),
//     .o_x_3(x_3),
//     .o_x_4(x_4),
//     .o_x_5(x_5),
//     .o_x_6(x_6),
//     .o_x_7(x_7)
// );

rom_x_0 u_rom_x_0(
    .i_code_cnt(code_cnt),
    .o_x_0(x_0)
);

rom_x_1 u_rom_x_1(
    .i_code_cnt(code_cnt),
    .o_x_1(x_1)
);

rom_x_2 u_rom_x_2(
    .i_code_cnt(code_cnt),
    .o_x_2(x_2)
);

rom_x_3 u_rom_x_3(
    .i_code_cnt(code_cnt),
    .o_x_3(x_3)
);

rom_x_4 u_rom_x_4(
    .i_code_cnt(code_cnt),
    .o_x_4(x_4)
);

rom_x_5 u_rom_x_5(
    .i_code_cnt(code_cnt),
    .o_x_5(x_5)
);

rom_x_6 u_rom_x_6(
    .i_code_cnt(code_cnt),
    .o_x_6(x_6)
);

rom_x_7 u_rom_x_7(
    .i_code_cnt(code_cnt),
    .o_x_7(x_7)
);

rom_l u_rom_l(
    .i_code_cnt(code_cnt),
    .o_l_0(l_0),
    .o_l_1(l_1),
    .o_l_2(l_2),
    .o_l_3(l_3),
    .o_l_4(l_4),
    .o_l_5(l_5),
    .o_l_6(l_6),
    .o_l_7(l_7)
);

rom_m u_rom_m(
    .i_code_cnt(code_cnt),
    .o_m_0(m_0),
    .o_m_1(m_1),
    .o_m_2(m_2),
    .o_m_3(m_3),
    .o_m_4(m_4),
    .o_m_5(m_5),
    .o_m_6(m_6),
    .o_m_7(m_7)
);

endmodule
